package com.duobaoyu.dby.supply.common.biz.remote.to.order;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 订单明细TO
 *
 * @author chenms
 * @date 2023/10/12 4:11 PM
 */
@Data
public class OrderDetailTO implements Serializable {

    /**
     * 渠道订单总金额
     */
    private BigDecimal channelOrderAmount;
    /**
     * 渠道运费
     */
    private BigDecimal channelFreightAmount;

    /**
     * 订单类型.real-实物订单;call-话费快充订单;flow-流量订单;coupon-卡密订单;recharge-直充订单;call_slow-话费慢充订单;electricity_fees-电费订单;electricity_fees_slow-电费慢充订单;
     */
    private String orderType;

    /**
     * 业务订单交易号(与供应链订单号一一对应)
     */
    private String bizTradeSn;
    /**
     * 供应链交易单号(与业务订单号一一对应)
     */
    private String supplyTradeSn;

    /**
     * 渠道子单号
     */
    private String channelOrderSn;

    /**
     * 渠道父单号
     */
    private String channelOrderParentSn;

    /**
     * 渠道交易单号
     */
    private String channelTradeOrderSn;
    /**
     * 供应链订单号
     */
    private String orderSn;
    /**
     * 供应链订单号父单号
     */
    private String orderParentSn;
    /**
     * 0:拆单前、1:拆单后
     */
    private Integer parentType;
    /**
     * 系统内部名称
     */
    private String serverName;
    /**
     * 手机号/充值账号
     */
    private String rechargeAccount;
    /**
     * 下单失败原因
     */
    private String failReason;
    /**
     * 取消原因
     */
    private String cancelReason;
    /**
     * 备注信息
     */
    private String orderRemark;
    /**
     * 订单状态.10-待支付;20-处理中;21-处理失败;30-待发货;40-部分发货;41-已发货;50-部分成功;60-已完成;70-取消中;71-已取消;
     */
    private Integer orderStatus;
    /**
     * 订单标签: async-异步;sync-同步;large_order-大额订单;ordinary_order-普通订单;repairing-补单中
     */
    private String orderTag;

    /**
     * 确认订单时间
     */
    private LocalDateTime confirmOrderTime;
    /**
     * 商户ID
     */
    private String mchId;
    /**
     * 用户ID
     */
    private String userId;
    /**
     * 状态变更时间
     */
    private LocalDateTime statusChangeTime;

    /**
     * 订单收货地址
     */
    private OrderAddressTO orderAddress;

    /**
     * 订单商品
     */
    private List<OrderProductTO> orderProductList;

    /**
     * 订单物流
     */
    private List<OrderLogisticsTO> orderLogisticsList;

	/**
	 * 子单信息
	 */
	private List<OrderDetailTO> subOrderDetailList;

    @Data
    public static class OrderAddressTO implements Serializable {
        /**
         * 省编码
         */
        private String provinceCode;
        /**
         * 省名称
         */
        private String provinceName;
        /**
         * 市编码
         */
        private String cityCode;
        /**
         * 市名称
         */
        private String cityName;
        /**
         * 区编码
         */
        private String countyCode;
        /**
         * 区名称
         */
        private String countyName;
        /**
         * 县、镇编码
         */
        private String townCode;
        /**
         * 县、镇名称
         */
        private String townName;
        /**
         * 详细地址
         */
        private String address;
        /**
         * 收件人姓名
         */
        private String recipientName;
        /**
         * 收件人手机号
         */
        private String recipientMobile;
        /**
         * 收件人身份证号
         */
        private String recipientIdCardNum;
    }

    @Data
    public static class OrderProductTO implements Serializable {
        /**
         * 渠道编码
         */
        private String channelCode;
        /**
         * 商品类型 :real->实物商品；call->话费快充商品；coupon->卡券；recharge->直充商品；call_slow->话费慢充商品；electricity_fees_slow->电费慢充商品
         */
        private String productType;
        /**
         * 商品编码
         */
        private String productCode;
        /**
         * SKU编码
         */
        private String skuCode;
        /**
         * SKU名称
         */
        private String skuName;
        /**
         * SKU展示图
         */
        private String skuPic;
        /**
         * 商品数量
         */
        private Integer skuNum;
        /**
         * 商品单位
         */
        private String unit;

        /**
         * 销售属性
         */
        private String saleAttributes;

        /**
         * 原价(面额)
         */
        private BigDecimal originalPrice;

        /**
         * 平台销售价格
         */
        private BigDecimal platformSellPrice;

        /**
         * 虚拟卡卷专用字段,需要退款百分比,订单状态50时使用，进行部分退款操作
         */
        private BigDecimal receivedPercentage;

        /**
         * 虚拟卡卷专用字段,已经退款百分比,订单状态50时使用，进行部分退款操作
         */
        private BigDecimal refundPercentage;

        /**
         * 到账金额
         */
        private BigDecimal actualAmount;

        /**
         * 渠道退款/拒收商品数量
         */
        private Integer channelReturnSkuNum;

        /**
         * 渠道退运费金额(平安渠道发生退款有值)
         */
        private BigDecimal channelReturnFreightAmount;

        /**
         * 扩展数据
         */
        private ExtendInfo extendInfo;

        /**
         * 扩展数据
         */
		@Data
		@Builder
		@NoArgsConstructor
		@AllArgsConstructor
        public static class ExtendInfo implements Serializable {

            /**
             * 卡券集合
             */
            private List<CouponInfo> couponInfos;
			/**
			 * 卡卷信息
			 */
			private CouponInfo couponInfoDetails;
            /**
             * 卡券信息
             */
            @Data
			@Builder
			@NoArgsConstructor
			@AllArgsConstructor
            public static class CouponInfo implements Serializable {
                /**
                 * 卡券生成码规则，0：二维码；1：条形码；2：条形码和二维码；3：卡券URL地址；4：只包含密码；5：卡号和密码；6：图片
                 */
                private Integer cardType;
                /**
                 * 卡券唯一码（卡密无此参数）
                 */
                private String uniqueCode;
                /**
                 * 卡号（卡券无此参数）
                 */
                private String cardNo;
                /**
                 * 卡密（卡券无此参数）
                 */
                private String cardPwd;
                /**
                 * 卡券URL地址
                 */
                private String cardLink;
                /**
                 * 卡券生成时间
                 */
                private Long cardCreateTime;
                /**
                 * 有效期
                 */
                private Long effectiveTime;
            }
        }
    }

    @Data
    public static class OrderLogisticsTO {
        /**
         * 快递承运编号
         */
        private String deliveryOrderSn;
        /**
         * 快递承运人
         */
        private String deliveryCarrier;

    }
}
